package co.edu.udea.iw.dao.impl;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import co.edu.udea.iw.dao.ClienteDAO;
import co.edu.udea.iw.dto.Cliente;
import co.edu.udea.iw.exception.IWDaoException;

public class ClienteDAOImp extends HibernateDaoSupport implements ClienteDAO {

	@Override
	public List<Cliente> obtener() throws IWDaoException {
		Session sesion = null;
		List<Cliente> lista = null;
		
		try{
			sesion = getSession();
			
			lista = sesion.createCriteria(Cliente.class)
					      .add(Restrictions.ne("eliminado", new Boolean(true)))
					      .addOrder(Order.asc("nombres"))
						  .list();
			
			return lista;
			
		}catch (HibernateException e) {
			throw new IWDaoException(e);
		}
	}

	@Override
	public Cliente obtener(String cedula) throws IWDaoException {
		Session sesion = null;
		Cliente cliente = null;
		
		try{
			sesion = getSession();
			
//			cliente = (Cliente)sesion.load(Cliente.class, cedula);
			
			cliente = (Cliente)sesion.get(Cliente.class, cedula);
			
//			cliente = (Cliente)sesion.createCriteria(Cliente.class)
//						.add(Restrictions.eq("cedula", cedula))
//						.uniqueResult();
			
			return cliente;
			
		}catch (HibernateException e) {
			throw new IWDaoException(e);
		}
	}

	@Override
	public void guardar(Cliente cliente) throws IWDaoException {
		Session session = null;
		Transaction tx = null;
		try{
			tx = getSession().beginTransaction();
			getHibernateTemplate().save(cliente);
			tx.commit();
		}catch (HibernateException e) {
			throw new IWDaoException(e);
		}
	}
	
	@Override
	public void actualizar(Cliente cliente) throws IWDaoException {
		Session session = null;
		try{
			getHibernateTemplate().update(cliente);
		}catch (HibernateException e) {
			throw new IWDaoException(e);
		}
		
	}
	
	@Override
	public void eliminar(Cliente cliente) throws IWDaoException {
		Session session = null;
		try{
			getHibernateTemplate().delete(cliente);
		}catch (HibernateException e) {
			throw new IWDaoException(e);
		}
	}

}
